package com.innerclass_;

import com.interface_.IA;

/**
 * @Author 小闽
 * @Date 2024/9/17 11:20
 * @PackageName: com.innerclass_
 * @ClassName: AnonymousInnerClass
 * @Description: 匿名内部类
 * @Version 1.0
 */
public class AnonymousInnerClass {
    public static void main(String[] args) {
        // 创建Outer04对象
        Outer04 outer04 = new Outer04();
        outer04.method();
    }
}
class Outer04{
    private int n1 = 10; // 属性
    public void method(){ // 方法
        // 基于接口的匿名内部类
        // 1. 需求：想使用IA接口，并创建对象
        // 2. 传统方式，是写一个类，实现该接口，并创建对象
        // 3. 更新需求：老虎类只需要使用一次，后面就不在使用了
        // 4. 可以使用匿名内部类来简化开发
        // 5. tiger的编译类型是？IA
        // 6. tiger的运行类型是？就是匿名内部类
        /*
        在jdk的底层中，系统会为这个匿名内部类去分配一个类名，类名为Outer04$1
            class Xxxx implement {
                 @Override
                 public void cry() {
                     System.out.println("老虎叫唤...");
                  }
            }
         */
        // 7. jdk底层在创建匿名内部类 Outer04$1,立即马上就创建了Outer04$1,在创建完成后，
        // 会将地址返回给tiger这个对象名
        // 8. 匿名内部类只使用一次就不能在使用了
//        IA tiger = new Tiger();
//        tiger.cry();
        IA1 tiger = new IA1() {
            @Override
            public void cry() {
                System.out.println("老虎叫唤...");
            }
        };
        tiger.cry();
        tiger.cry();
        tiger.cry();

        // 基于类的匿名内部类
        //1. father的编译类型为Father
        //2. father的运行类型为匿名内部类即Outer04$2
        //3. 底层会创建匿名内部类
        //4. 注意：jack的参数列表会传递给构造器
        /*
            class Outer04$2 extend Father{
            }
         */
        Father father = new Father("jack"){
            @Override
            public void test() {
                System.out.println("这是匿名内部类的test方法...");
            }

        };
        System.out.println("father的匿名内部类为：" + father.getClass());
        father.test();
        // 基于抽象类的匿名内部类
        Animal animal = new Animal(){
            @Override
            void eat() {
                System.out.println("小狗吃骨头...");
            }
        };
        animal.eat();
    }
}

interface IA1{ // 接口
    public void cry(); // 抽象方法
}
//class Tiger implements IA{
//
//    @Override
//    public void cry() {
//        System.out.println("老虎叫唤...");
//    }
//}
//class Dog implements IA{
//
//    @Override
//    public void cry() {
//        System.out.println("小狗叫唤...");
//    }
//}
class Father{
    public Father(String name){ // 有参构造器
        System.out.println("接受的匿名内部类的名字name=" + name);
    }
    public void test(){ // 方法

    }
}

abstract class Animal{
    abstract void eat();
}